package com.prs.crm.service.project;

import java.io.File;
import java.util.Collection;

import org.courser.ui.PaginationSupport;
import org.hibernate.criterion.DetachedCriteria;

import com.prs.crm.domain.hr.Person;
import com.prs.crm.domain.project.Project;
import com.prs.crm.domain.project.Task;
import com.prs.crm.domain.project.TaskAttach;
import com.prs.crm.service.SimpleFlowService;

public interface TaskService extends SimpleFlowService<Task>{
	
	/**
	 * 查询我的任务
	 * @param person 任务执行人
	 * @param result 返回的最大条数
	 * @return 任务集合
	 */
	Collection<Task> findExecuteTask(Person person,int result);
	/**
	 * 发送任务通知
	 * @param task
	 * @param person
	 */
	void sendTaskNotice(Task task);
	
	Collection<Task> findRootTasks(final Integer[] projectIds);
	/**
	 * 查找项目的根任务
	 * @param critique
	 * @param task
	 */
	Task findRootTask(Project project);
	
	/**
	 * 提交任务
	 * @param task
	 * @param files
	 * @param fileNames
	 */
	void submitTask(Task task,File[] files,String[] fileNames);
	
	void createTask(Task task,Project project);
	
	void verifySubmit(Task task);
	
	void removeTask(Task task);
	
	/**
	 * 提交任务报告
	 * @param task
	 * @param attach
	 * @param file
	 * @param fileName
	 */
	void submitTaskAttach(Task task,TaskAttach attach,File file,String fileName);
	
	/**
	 * 更新任务报告
	 * @param attach
	 * @param file
	 * @param fileName
	 */
	void updateTaskAttach(TaskAttach attach,File file,String fileName);
	
	/**
	 * 批量删除任务报告
	 * @param ids
	 */
	void removeAttachs(Integer[] ids);
	/**
	 * 分解任务
	 * @param childTask子任务
	 * @param rootTask
	 */
	void createChildTask(Task childTask,Task rootTask,String joiner,File[] attachs,String[] fileNames);
	

	
	//WorkFlowProcess save(Task task,File[] attachs,String[] fileNames,WorkFlowInstance instance);
	
	//void submit(Task task,WorkFlowInstance instance,File[] attachs,String[] fileNames);
	
	PaginationSupport listTaskCritique(DetachedCriteria criteria,PaginationSupport page,Task task);
	
	
	/**
	 * 列出执行人任务
	 * 不包含打回的任务
	 * @param criteria
	 * @param page
	 * @param owner
	 * @return
	 */
	PaginationSupport listExecuteTask(DetachedCriteria criteria,PaginationSupport page,Person owner);
	
	/**
	 * 列出打回的任务
	 * @param criteria
	 * @param page
	 * @param executor
	 * @return
	 */
	PaginationSupport listInValidTask(DetachedCriteria criteria,PaginationSupport page,Person executor);

	/**
	 * 列出参与人任务
	 * @param criteria
	 * @param page
	 * @param recorder
	 * @return
	 */
	PaginationSupport listJoinTask(DetachedCriteria criteria,PaginationSupport page,Person recorder);
	
	/**
	 * 列出当前人的已经执行结束的任务
	 * @param criteria
	 * @param page
	 * @param executor
	 * @return
	 */
	PaginationSupport listExecuteEndTask(PaginationSupport page,Person executor);
	
	/**
	 * 列出任务审核历史
	 */
	PaginationSupport listVerifyTaskHistory(PaginationSupport page,Person verifier);
	
	/**
	 * 列出任务的报告
	 * @return
	 */
	PaginationSupport listTaskReports(PaginationSupport page,Task task);
	
	/**
	 * 更新项目关联任务的状态和流程状态
	 * @param project 项目
	 * @param status 任务状态
	 * @param flowstatus 任务流程状态
	 * @return
	 */
	int updateProjectTaskStatus(final Project project,final  Integer status,final Integer flowstatus);
	
	int executeFrostProjectTasks(Project project);
	
	int executeUnFreezeProjectTasks(Project project);
	
	/**
	 * 当前任务执行总数
	 * @param executor
	 * @return
	 */
	int countExecuteTask(Person executor);
	
	/**
	 * 当前参与任务总数
	 * @param joiner
	 * @return
	 */
	int countJoinTask(Person joiner);
	
	
	/**
	 * 当前审核任务总数
	 * @param verifyer
	 * @return
	 */
	int countVerifyTask(Person verifyer);
	
	/**
	 * 当前需提交报告的任务总数
	 * @param executor
	 * @return
	 */
	int countSumitReportTask(Person executor);
	
	/**
	 * 当前打回的任务总数
	 * @param executor
	 * @return
	 */
	int countInValidTask(Person executor);
}
